package DateCheck;

import java.awt.Color;
import java.util.Calendar;

import javax.swing.*;

public class DateCheck
{
	//Variables d'instances
	private int dayError = 0, monthError = 0, yearError = 0, dayInt, monthInt, yearInt;
	private boolean dateError = true;
	private int jourEnCours = Calendar.getInstance().get(Calendar.DATE), moisEnCours = (Calendar.getInstance().get(Calendar.MONTH))+1, anneeEnCours = Calendar.getInstance().get(Calendar.YEAR);
	private String dayString, monthString, yearString;
	
	//Methods
	public void dateCheckComplete(JTextField fieldDate) throws NumberFormatException //Verifie la date completement
	{
		retrieveEachValueDateFromField(fieldDate); //Recupere le contenu dans 3 Strings
		parseIntEachValueInDate(); //Transforme les Strings en Integer
		checkEachValueInDate(); //Verifie si les valeurs sont des nombres authorise
		checkDayMonthError(); //Verification de la correspondance entre le nombre de jour et le mois
		setFieldDateColor(fieldDate); //Met le champ en rouge ou en vert selon si le champ est bon ou pas
	}
	
	public void retrieveEachValueDateFromField(JTextField fieldDate) //Recupere le contenu dans 3 Strings
	{
		yearString = "" + (fieldDate.getText().charAt(6)) + (fieldDate.getText().charAt(7)) + (fieldDate.getText().charAt(8)) + (fieldDate.getText().charAt(9)); //Recuperation de l'annee
		monthString = "" + (fieldDate.getText().charAt(3)) + (fieldDate.getText().charAt(4)); //Recuperation du mois
		dayString = "" + (fieldDate.getText().charAt(0)) + (fieldDate.getText().charAt(1)); //Recuperation du jour
	}
	
	public void parseIntEachValueInDate() throws NumberFormatException //Transforme les Strings en Integer
	{
		dayInt = Integer.parseInt(dayString);
		monthInt = Integer.parseInt(monthString);
		yearInt = Integer.parseInt(yearString);
	}
	
	public void checkEachValueInDate() //Verifie si les valeurs sont des nombres authorise
	{
		checkDay(); //Verification du jour
		checkMonth(); //Verification du mois
		checkYear(); //Verification de l'annee
	}
	
	public void checkDay() //Verification du jour
	{
		if(dayInt > 31 || dayInt < 1) //Si le jour est plus grand que 31 ou plus petit que 1
			dayError = 1; //Flag du jour a 1
	}
	
	public void checkMonth() //Verification du mois
	{
		if(monthInt > 12 || monthInt < 1) //Si le jour est plus grand que 12 ou plus petit que 1
			monthError = 1; //Flag du mois a 1
	}
	
	public void checkYear() //Verification de l'annee
	{
		if(yearInt > anneeEnCours || yearInt < 1964) //Si le jour est plus grand que l'annee en cours ou plus petit que 1964
			yearError = 1; //Flag de l'annee a 1
	}
	
	public void checkDayMonthError() //Verification de la correspondance entre le nombre de jour et le mois
	{
		if(dayError == 0 && monthError == 0 && yearError == 0) //Si chaque partie de la date est correcte
		{
			if(yearInt == anneeEnCours) //Si l'annee du champ vaut l'annee en cours
				if(monthInt > moisEnCours) //Si le mois du champ est plus grand que le mois en cours
					yearError = 1; //Flag de l'annee en cours a 1
				else
					if(monthInt == moisEnCours && dayInt > jourEnCours) //Si le mois du champ vaut le mois en cours et que le jour du champ est plus grand que le jour en cours
						yearError = 1; //Flag de l'annee en cours 1
		}
		if(dayError == 0 && monthError == 0 && yearError == 0) //Si la date est correcte on teste si la date est plausible au niveau correspondance des jours par mois
			switch(monthInt) //Selon le mois
			{
				case 2: //Si on est en fevrier
					if(dayInt > 29) //Si le jour est plus grand que 29
						dayError = 1; //Flag du jour a 1
					break;
				
				case 4:case 6:case 9:case 11: //Si on est en avril, juin, septembre, novembre
					if(dayInt > 30) //Si le jour est plus grand que 30
						dayError = 1; //Flag du jour a 1
					break;
				
				default:
					break;
			}
		if(dayError == 0 && monthError == 0 && yearError == 0) //On retest pour voir si il y a eu une erreur de date pour mettre le flag principal dans l'etat qui correspond
			dateError = false; //Flag de la date a 0
		else
			dateError = true; //Flag de la date a 1
	}
	
	public void setFieldDateColor(JTextField fieldDate) //
	{
		if(getDayError() == 0 && getMonthError() == 0 && getYearError() == 0)
			fieldDate.setBackground(Color.GREEN);
		else
		{
			fieldDate.setBackground(Color.RED);
			fieldDate.setText(null);
		}
	}
	
	public void resetFieldDateColor(JTextField fieldDate)
	{
		fieldDate.setBackground(Color.WHITE);
	}
	
	//Gettor
	public int getDayInt()
	{
		return dayInt;
	}
	
	public int getMonthInt()
	{
		return monthInt;
	}
	
	public int getYearInt()
	{
		return yearInt;
	}
	
	public String getDayString()
	{
		return dayString;
	}
	
	public String getMonthString()
	{
		return monthString;
	}
	
	public String getYearString()
	{
		return yearString;
	}
	
	public int getDayError()
	{
		return dayError;
	}
	
	public int getMonthError()
	{
		return monthError;
	}
	
	public int getYearError()
	{
		return yearError;
	}
	
	public boolean getDateError()
	{
		return dateError;
	}
	
	//Settor
	public void setAllFlagdDateErrorReset()
	{
		setDayError();
		setMonthError();
		setYearError();
		setDateError();
	}
		
	public void setDayError()
	{
		dayError = 0;
	}
	
	public void setMonthError()
	{
		monthError = 0;
	}
	
	public void setYearError()
	{
		yearError = 0;
	}
	
	public void setDateError()
	{
		dateError = true;
	}
}
